from flask import Flask, jsonify, request
import akshare as ak
import pandas as pd
import datetime

# 设置pandas显示选项，让DataFrame数据完整显示
# pd.set_option('display.max_columns', None)  # 显示所有列
# pd.set_option('display.max_colwidth', 100)  # 设置列内容最大宽度
# pd.set_option('display.expand_frame_repr', False)  # 不换行显示

app = Flask(__name__)
# /getHs300 增加query参数 ，pe_gth > ?  pe_lth < ?
@app.route('/getHs300', methods=['GET'])
def get_hs300():
    try:
        result = {
            'status': 'success',
            'timestamp': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            'data': []
        }

        # 1. 获取沪深300指数成分股
        print("正在获取沪深300指数成分股...")
        sh_index_stocks = ak.index_stock_cons(symbol="000300")  # 000300是沪深300指数代码
        print(f"获取到 {len(sh_index_stocks)} 只成分股")
        stock_code = "601991"
        # 查看当前股票 2024年的 净利润 和  净资产 数据
 
        df = ak.stock_zh_a_hist(symbol=stock_code, period="daily", start_date="20240101", end_date="20250808", adjust="qfq")
        print(df)

        stock_financial_benefit_ths = ak.stock_financial_benefit_ths(symbol=stock_code, indicator="按年度")
        # 只打印前10行
        print(stock_financial_benefit_ths.head(10))

        #当前行下方的所有代码 暂不执行
        return jsonify(result)

        # 2. 获取所有A股实时行情数据
        print("正在获取所有A股实时行情数据...")
        all_stock_data = ak.stock_zh_a_spot_em()

        # 3. 筛选出沪深300成分股的行情数据
        # 动态确定股票代码列名
        stock_code_column = None
        for col in ['code', '股票代码', 'symbol']:
            if col in sh_index_stocks.columns:
                stock_code_column = col
                break

        if stock_code_column is None:
            print("错误: 无法找到股票代码列")
            # 使用第一列作为股票代码列
            stock_code_column = sh_index_stocks.columns[0]
            print(f"警告: 尝试使用列 '{stock_code_column}' 作为股票代码列")

        # 确保股票代码格式一致（去除市场标识）
        sh_index_stocks['code'] = sh_index_stocks[stock_code_column].astype(str).str.strip()
        all_stock_data['code'] = all_stock_data['代码'].astype(str).str.strip()

        # 合并数据
        print("正在筛选沪深300成分股行情数据...")
        hs300 = pd.merge(sh_index_stocks, all_stock_data, on='code', how='inner')

        # 4. 筛选市盈率大于2小于5的股票
        print("正在筛选市盈率大于2小于5的股票...")
        # 确保'市盈率-动态'列存在
        # query 参数 动态传入 
        pe_gth = request.args.get('pe_gth', default=2, type=float)
        pe_lth = request.args.get('pe_lth', default=5, type=float)
        if '市盈率-动态' in hs300.columns:
            hs300 = hs300[hs300['市盈率-动态'] > pe_gth]
            hs300 = hs300[hs300['市盈率-动态'] < pe_lth]
        else:
            print("警告: 数据中没有找到'市盈率-动态'列")
            print(f"可用列: {hs300.columns.tolist()}")
            result['status'] = 'warning'
            result['message'] = '数据中没有找到\'市盈率-动态\'列'
            return jsonify(result)

        # 5. 去除重复行
        print("正在去除重复行...")
        hs300 = hs300.drop_duplicates(subset=['code'])

        # 6. 准备返回数据
        if not hs300.empty:
            # 按照市盈率排序
            hs300 = hs300.sort_values(by='市盈率-动态')
            # 转换为字典列表
            stock_list = []
            for _, row in hs300.iterrows():
                stock_info = {
                    'code': row['code'],
                    'name': row['名称'],
                    'pe': row['市盈率-动态']
                }
                stock_list.append(stock_info)
            result['data'] = stock_list
            result['count'] = len(stock_list)
            print(f"找到 {len(stock_list)} 只符合条件的股票")
        else:
            print("未找到符合条件的股票")
            result['status'] = 'info'
            result['message'] = '未找到符合条件的股票'

        return jsonify(result)

    except Exception as e:
        print(f"发生错误: {str(e)}")
        return jsonify({
            'status': 'error',
            'message': str(e),
            'timestamp': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        })

if __name__ == '__main__':
    print("启动Flask服务器，监听端口3300...")
    app.run(host='0.0.0.0', port=3300, debug=True)